import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
public class Simulation
{
    public static int BREITE=200;
    public static int HOEHE=200; //Simulation.HOEHE
    private Raster grid;
    private Darstellung view;
    private Timer uhr;
    public double t; //Zeitraffer
    private ActionListener ticke;
    private int anzahlBakterien, anzahlSchimmelpilze;

    public static void main (String[] args)
    {
        Raster grid = new Raster();
        Darstellung view = new Darstellung(grid);
        Simulation s = new Simulation(grid, view);
        view.setzeSimulation(s);
        grid.setzeSimulation(s);
    } 

    public Simulation (Raster grid0, Darstellung view)
    {
        this.grid = grid0;
        this.view = view;
        grid.zufallstart(view.getBacwachs(), view.getSchimmwachs(), view.getBacanz(), view.getSchimmanz());
        ticke = new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                for(int i=0; i<BREITE; i++)
                {
                    for(int j=0; j<HOEHE; j++)
                    {
                        grid.matrix(i,j).vermehre();
                    }
                }
                ticke(evt);
            }
        };

        t=50;
        uhr = new Timer( (int)(1000/t), ticke);
        zähle();
    }

    public void setzeZeitraffer(double raffer)
    {
        t=raffer;
    }

    public void start(double bacwachs, double schimmwachs, int bacanz, int schimmanz)
    {
        grid.setChilliVanilli(bacwachs, schimmwachs, bacanz, schimmanz);
        uhr.start();
    }

    public void pausiere()
    {
        uhr.stop();
    }

    public void ticke(ActionEvent evt)
    {
        view.getPTPanel().repaint();
        zähle();
    }
    
    public void zähle()
    {
        anzahlBakterien = 0;
        anzahlSchimmelpilze = 0;
        for (int i=0; i<Simulation.BREITE+1; i++) {
            for (int j=0; j<Simulation.HOEHE+1; j++) {
                if(grid.getMatrix()[i][j]instanceof Bakterium)
                {
                    anzahlBakterien++;
                }
                else if(grid.getMatrix()[i][j]instanceof Schimmelpilz)
                {
                    anzahlSchimmelpilze++;
                }
            }
        }
        view.setSchimmelAnz(anzahlSchimmelpilze);
        view.setBakterienAnz(anzahlBakterien);
        
    }

    public void restart()
    {
        uhr.stop();
        for (int i=0; i<Simulation.BREITE+1; i++) {
            for (int j=0; j<Simulation.HOEHE+1; j++) {
                //übergebe Rasterreferenz, x-, sowie y-Wert der neuen Lebewesen im Raster
                grid.getMatrix()[i][j]=new Leer(this.grid, i, j);
            }
        }
        view.getPTPanel().repaint();
        grid.zufallstart(view.getBacwachs(), view.getSchimmwachs(), view.getBacanz(), view.getSchimmanz());
        uhr=new Timer( (int) (1000/t),ticke);
        zähle();
    }

    public Darstellung getDarstellung()
    {
        return view;
    }

}

